package com.sky.service.impl;

import com.sky.context.BaseContext;
import com.sky.dto.ShoppingCartDTO;
import com.sky.entity.Dish;
import com.sky.entity.Setmeal;
import com.sky.entity.ShoppingCart;
import com.sky.mapper.DishMapper;
import com.sky.mapper.SetmealMapper;
import com.sky.mapper.ShoppingCartMapper;
import com.sky.service.ShoppingCartService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;

@Service
public class ShoppingCartServiceImpl implements ShoppingCartService {

    @Autowired
    private ShoppingCartMapper shoppingCartMapper;

    @Autowired
    private DishMapper dishMapper;

    @Autowired
    private SetmealMapper setmealMapper;


    /**
     * 添加购物车
     *
     *  1. 要执行数据的转化，把dto转化成实体类
     *  2. 查询数据库，判定这道菜|套餐， 到底是新的数据还是旧的数据 ：
     *      ， 在这里要把菜品ID 、口味数据、 套餐ID， user_id 一起合并做动态SQL 查询..
     *
     *  3. 如果查询到的是【新的购物车数据】，那么就执行数据库的添加操作
     *      3.1 根据给过来的菜品ID或者套餐ID去查询出来具体的数据。
     *      3.2 给实体类封装 name 、image 、 amount 、 create_time  、 number = 1 , user_id
     *
     *  4. 如果查询到的是【旧数据】 （就是购物车表里面有这条记录）那么就执行更新操作
     *      4.1 要找到菜品或者套餐的数据
     *      4.2 如果找到了就让他数量 + 1
     *
     * @param dto
     */
    @Override  // 麻辣烤鱼...
    public void add(ShoppingCartDTO dto) {
        //1. 转化数据
        ShoppingCart shoppingCart = new ShoppingCart();
        BeanUtils.copyProperties(dto , shoppingCart);
        shoppingCart.setUserId(BaseContext.getCurrentId());

        //2. 判定在数据库表里面有没有这道菜 【条件: user_id 【必须】 , dish_id【非必须】 ， setmeal_id 【非必须】,  dishFlavor 【非必须】  】
        List<ShoppingCart> list = shoppingCartMapper.list(shoppingCart);

        //3. 获取集合里面的 0 号下标的元素【这个集合有且只有一个元素回来。上面的查询已经把条件设置的很苛刻了，所以不会出现多条记录】
        // 上面的条件，要么是有菜品ID， 要么是有菜品ID和口味值，要么是有套餐ID。不管是这三种的哪一种条件，再加上 user_id 都不会得到两道菜回来！
        if(list!= null && list.size() > 0){
            //把这道菜 | 套餐拿出来
            ShoppingCart cartInDB = list.get(0);

            //4.1 原来数量基础 + 1
            cartInDB.setNumber(cartInDB.getNumber() + 1);

            //4.2 操作数据库，更新操作
            shoppingCartMapper.update(cartInDB);
        }else{
            // 如果来到这里，即表示数据库表没有这道菜 |  套餐
            //5. 如果来到这里，即表示 cartInDB = null, 也就是数据库里面没有这道菜 | 套餐
            //5.1 判定现在添加操作购物车表的数据是菜品？ 还是套餐呢？
            if(shoppingCart.getDishId() != null){
                //5.2 查询菜品表，得到这道菜的详细信息
                Dish dish = dishMapper.findById(dto.getDishId());
                //5.2.1 补充shoppingcart数据
                addShoppingCart(shoppingCart , dish.getName() ,  dish.getImage(), dish.getPrice());
            }else{
                //5.3 查询套餐表，得到这道套餐的详细信息
                Setmeal setmeal = setmealMapper.getById(dto.getSetmealId());
                //5.3.1 补充shoppingcart数据
                addShoppingCart(shoppingCart , setmeal.getName() ,  setmeal.getImage(), setmeal.getPrice());
            }
        }
    }

    /**
     * 查询购物车
     *
     * @return
     */
    @Override
    public List<ShoppingCart> list() {
        return shoppingCartMapper.list(ShoppingCart.builder().id(BaseContext.getCurrentId()).build());
    }

    /**
     * 请空购物车
     */
    @Override
    public void clean() {
        shoppingCartMapper.deleteByUid(BaseContext.getCurrentId());
    }


    private void addShoppingCart(ShoppingCart shoppingCart , String name , String image, BigDecimal price){

        shoppingCart.setName(name);
        shoppingCart.setImage(image);
        shoppingCart.setAmount(price);
        shoppingCart.setCreateTime(LocalDateTime.now());
        shoppingCart.setNumber(1);

        //5.3.2 添加到数据库
        shoppingCartMapper.add(shoppingCart);
    }
}
